perm filename SYSPAT.FAI[SS,SYS] blob
sn#883103 filedate 1990-03-21 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00002 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 F A B C D E T TT TTT W X Y Z P DS LDISK DISKBF LPDL PDL ACWPRV DMPFIL FILE REENTA SYSFIX REENT2 NOFIXT CH4BEG CH4END DDBBEG DDBEND MTIBEG MTIEND OLOOP TOOBIG INOK ILOOP NOFIX NODIFF DIFF FIXNOW FIXYES YORN YESYES YORN0 YORN2 YORN3 YORN4 OCTOUT OCTOU2 OCTOU4 OCTOU3 DECOUT SYMLUZ SETLUZ NOLOOK FERROR MAXERR FSCAN FSCAN1 FILNAM FSCAN2 FSCAN3 FCOPY GETSIX GETSX1 NOQUOT GETSX2 GETSX3 RADJ FERR1 FERR TYPFIL TYPSIX TYPSI1 TYPSI2
C00020 ENDMK
C⊗;
;⊗ F A B C D E T TT TTT W X Y Z P DS LDISK DISKBF LPDL PDL ACWPRV DMPFIL FILE REENTA SYSFIX REENT2 NOFIXT CH4BEG CH4END DDBBEG DDBEND MTIBEG MTIEND OLOOP TOOBIG INOK ILOOP NOFIX NODIFF DIFF FIXNOW FIXYES YORN YESYES YORN0 YORN2 YORN3 YORN4 OCTOUT OCTOU2 OCTOU4 OCTOU3 DECOUT SYMLUZ SETLUZ NOLOOK FERROR MAXERR FSCAN FSCAN1 FILNAM FSCAN2 FSCAN3 FCOPY GETSIX GETSX1 NOQUOT GETSX2 GETSX3 RADJ FERR1 FERR TYPFIL TYPSIX TYPSI1 TYPSI2
TITLE SYSPAT Program to compare special parts of system core against disk version.
.INSERT WATSIT[S,SYS] ;Define FTF2, etc.
F←0
A←1
B←2
C←3
D←4
E←5
T←6
TT←7 ;Must be T+1
TTT←←10 ;Clobberred by OCTOUT
W←13
X←14
Y←15
Z←16
P←17
DS←←1
LDISK←←=18*200
DISKBF: BLOCK LDISK ;Space for data from disk version of system.
LPDL←←30
PDL: BLOCK LPDL
ACWPRV←←40 ;LH priv bit
LOC 124
REENTA ;Set up REENTER address
RELOC
DMPFIL: SIXBIT/WAITS/ ;Default DMP file holding system on disk
SIXBIT/DMP/
0
IFE FTF2,<SIXBIT/ SSYS/>
IFN FTF2,<SIXBIT/ 1 2/>
FILE: BLOCK 4 ;DMP file specified in command line
REENTA: SETOM FIXIT ;Flag reenter cmd, allow correcting system core
SETZM FIXALL
MOVSI A,1
GETPRV A, ;Get passive privs
TLNE A,ACWPRV ;Can this guy fix things?
JRST REENT2 ;Yes
SYSFIX: JFCL ;Allow for RPG startup
SETZM FIXIT# ;Not reentered, no fixing system
REENT2: RESET
MOVE P,[IOWD LPDL,PDL]
PUSHJ P,FSCAN ;Scan for filename, store in DMPFIL
SETZM FIXALL# ;non zero means fix all differences found
SETZM NDIFFS# ;Number of differences found
SETZM NFIXES# ;Number of words fixed from file
OUTSTR [ASCIZ/Comparing part of system with /]
PUSHJ P,TYPFIL
OUTSTR [ASCIZ/.
Any differences will be typed out/]
SKIPN FIXIT
JRST NOFIXT
OUTSTR [ASCIZ/ and you will be able to selectively
correct core from /]
PUSHJ P,TYPFIL
OUTSTR [ASCIZ/, in the order presented here.
Type Y<cr> or <bucky>Y when prompted to correct the core location,
or type GO<cr> to correct all such locations from here on,
but do NOT type ahead/]
NOFIXT: OUTSTR [ASCIZ/.
/]
INIT DS,217
'DSK '
0
HALT .
MOVE Z,[DMPFIL,,W]
BLT Z,Z
LOOKUP DS,W
JRST NOLOOK
MOVSI A,ACWPRV
SKIPE FIXIT
SETPRV A, ;Enable
MOVSI A,377777
SKIPE FIXIT
TLZ A,1 ;Request write permission
SETPR2 A, ;MAP SYSTEM INTO UPPER SEGMENT
JRST SETLUZ
CH4BEG←←17345 ;beginning address to check (CONSZ chain)
CH4END←←17347 ;end address + 1
DDBBEG←←34607 ;MTC data area
DDBEND←←35164 ;end of MTC data area
MTIBEG←←230467 ;MTISER
MTIEND←←232024 ;end of MTISER
OUTSTR [ASCIZ/Will check CH4 area: /]
MOVEI T,CH4BEG
PUSHJ P,OCTOUT
OUTSTR [ASCIZ/ through /]
MOVEI T,CH4END-1
PUSHJ P,OCTOUT
OUTSTR [ASCIZ/
/]
OUTSTR [ASCIZ/Will check data area: /]
MOVEI T,DDBBEG
PUSHJ P,OCTOUT
OUTSTR [ASCIZ/ through /]
MOVEI T,DDBEND-1
PUSHJ P,OCTOUT
OUTSTR [ASCIZ/
/]
OUTSTR [ASCIZ/Will check MTISER area: /]
MOVEI T,MTIBEG
PUSHJ P,OCTOUT
OUTSTR [ASCIZ/ through /]
MOVEI T,MTIEND-1
PUSHJ P,OCTOUT
OUTSTR [ASCIZ/
/]
MOVEI A,CH4BEG ;Start comparing in CH4BEG
MOVEI B,MTIEND ;End of checked core
OUTSTR [ASCIZ/
/]
CAIL B,400000 ;Better not run out of room in SETPR2 upper segment
JRST TOOBIG ;System is too big
;Now B has ending address of the scan
SUBI B,-1(A) ;Amount of system to be checksummed
OLOOP: MOVEI C,-74(A) ;Next disk word we want
LSH C,-7 ;Adjust to record number (minus 1)
USETI DS,1(C) ;Read file at right place
IN DS,[IOWD LDISK,DISKBF↔0] ;Read whole track
JRST INOK
OUTSTR [ASCIZ/Error reading disk file./]
EXIT 1,
JRST OLOOP ;Try again?
TOOBIG: OUTSTR [ASCIZ/End of checked part is 400000 or greater! Must adjust
SETPR2 bounds in SYSFIX and recompile it./]
EXIT
INOK: MOVEI C,-74(A) ;Next disk word we want
ANDI C,177 ;Offset within first record read
MOVNI D,(C) ;Negative of number of words skipped starting record
ADDI D,LDISK ;D is now words to check in this disk track
CAML D,B ;Want to check remainder of track?
MOVE D,B ;No, only check amount left in system
SUB B,D ;Amount remaining next time at OLOOP
MOVN D,D ;Negative amt this buffer
HRLZ D,D ;AOBJN ptr into disk buffer
HRR D,C ;Skip over some words maybe
ILOOP: MOVE E,400000(A) ;Get word from system
CAME E,DISKBF(D) ;Same as on disk?
PUSHJ P,DIFF ;No!
ADDI A,1 ;Next system address
AOBJN D,ILOOP ;Next buffer address
JUMPG B,OLOOP ;Jump if more system to examine
RELEAS DS,
INSKIP ;Clear ESC O
JFCL
SKIPN T,NDIFFS
JRST NODIFF ;No differences
OUTSTR [ASCIZ/
/]
PUSHJ P,DECOUT ;Print number of differences
OUTSTR [ASCIZ/ difference/]
MOVE T,NDIFFS
CAIE T,1
OUTCHR ["s"]
OUTSTR [ASCIZ/ found/]
SKIPN T,NFIXES ;Any fixed?
JRST NOFIX
OUTSTR [ASCIZ/, /]
PUSHJ P,DECOUT ;Print number of fixes
OUTSTR [ASCIZ/ fixed/]
NOFIX: OUTCHR ["."]
MOVSI A,1
GETPRV A, ;Get passive privs
TLNE A,ACWPRV ;Can this guy fix things?
OUTSTR [ASCIZ/
Type REENTER monitor command to be able to selectively fix clobberages./]
EXIT
NODIFF: OUTSTR [ASCIZ/No differences encountered./]
EXIT
;We compare everything from CH4BEG to MTIEND, but we suppress differences
;appearing: between CH4END and DDBBEG, or between DDBEND and MTIBEG.
DIFF: CAIL A,MTIEND
POPJ P, ;ignore loc above MTIEND
CAIGE A,DDBBEG ;ignore addresses between CH4END and DDBBEG
CAIGE A,CH4END
CAIA
POPJ P, ;ignore difference in inconstant data area
CAIGE A,MTIBEG ;Is this address between DDBEND and MTIBEG?
CAIGE A,DDBEND
AOSA NDIFFS ;Count a difference and show it
POPJ P, ;Yes, ignore this word (of data)
MOVEI T,(A) ;System address
PUSHJ P,OCTOUT ;Print octal address
OUTSTR [ASCIZ/[ /]]
HLRZ T,E ;System value
PUSHJ P,OCTOUT ;Print LH value from sys
OUTSTR [ASCIZ/,,/]
HRRZ T,E ;RH
PUSHJ P,OCTOUT ;Print RH value from sys
OUTSTR [ASCIZ/ should be /]
HLRZ T,DISKBF(D) ;LH
PUSHJ P,OCTOUT ;Print LH value from disk
OUTSTR [ASCIZ/,,/]
HRRZ T,DISKBF(D) ;RH
PUSHJ P,OCTOUT ;Print RH value from disk
OUTSTR [ASCIZ/ -- XOR is /]
XOR E,DISKBF(D) ;See what changed
HLRZ T,E ;XOR LH
PUSHJ P,OCTOUT ;Print LH value from XOR
OUTSTR [ASCIZ/,,/]
HRRZ T,E ;RH
PUSHJ P,OCTOUT ;Print RH value from XOR
SKIPE FIXIT
PUSHJ P,FIXNOW ;Maybe fix core if user wants
SKIPN FIXIT
OUTSTR [ASCIZ/
/]
POPJ P,
FIXNOW: SKIPE FIXALL# ;Assuming Yes from here on?
JRST FIXYES
OUTSTR [ASCIZ/ Fix?/]
PUSHJ P,YORN ;Yes or No
POPJ P, ;No
CAIA ;Yes (no CRLF needed though)
FIXYES: OUTSTR [ASCIZ/ Fixed.
/]
MOVE E,DISKBF(D) ;Get word from disk buffer
EXCH E,400000(A) ;Correct system (save old system value in case...)
AOS NFIXES ;Count fixes
POPJ P,
;Get Yes or No answer. Skip if Yes.
YORN: CLRBFI
INCHWL T ;Read a char from TTY
MOVE TT,T
ANDI TT,137 ;Flush bucky bits, make upper case
CAIN TT,"Y"
JRST YESYES ;Yes
CAIE TT,"G"
JRST YORN0 ;No
INCHWL T ;Read a char from TTY
MOVE TT,T
ANDI TT,137 ;Flush bucky bits, make upper case
CAIE TT,"O"
JRST YORN0
OUTSTR [ASCIZ/You've said GO, which means correct this and all subsequent
differences without asking any more. Is that really what you want (Y or N)? /]
PUSHJ P,YORN ;Get confirmation of Y or N
EXIT 1, ;Not confirmed, abort
SKIPE FIXALL
EXIT 1, ;He said GO to the Y/N, abort
OUTSTR [ASCIZ/
OK, we'll correct all differences automatically now.../]
MOVEI TT,5
SLEEP TT, ;Give time to chicken out
OUTSTR [ASCIZ/.
/] ;Here we go.
SETOM FIXALL ;Flag to fix all subsequent diffs automatically
YESYES: AOS (P)
YORN0: CAIE T,175 ;Altmode
TRNE T,600 ;Or bucky bits?
JRST YORN2 ;Yes, echo CRLF
CAIN T,12 ;LF
JRST YORN3 ;Yes, echo CR
CAIN T,15 ;CR
JRST YORN4 ;Yes, read LF
INCHWL T ;Skip to end of answer line
JRST YORN0
YORN2: OUTSTR [ASCIZ/
/]
POPJ P,
YORN3: OUTCHR [15] ;Echo CR after LF!
POPJ P,
YORN4: INCHWL T ;Read LF after CR
TRNE T,600 ;Bucky bits on LF?
JRST YORN2 ;Yes, echo CR
POPJ P,
OCTOUT: MOVEI TTT,6 ;Number of digits to print
OCTOU2: IDIVI T,10
PUSH P,TT
SUBI TTT,1 ;Count a digit going out
JUMPE T,OCTOU3
PUSHJ P,OCTOU2
OCTOU4: POP P,T
ADDI T,"0"
OUTCHR T
POPJ P,
OCTOU3: JUMPLE TTT,OCTOU4
MOVEI T,"0"
OUTCHR T
SOJA TTT,OCTOU3 ;Nice slow loop
DECOUT: IDIVI T,=10
PUSH P,TT
JUMPE T,.+2
PUSHJ P,DECOUT
POP P,T
ADDI T,"0"
OUTCHR T
POPJ P,
SYMLUZ: OUTSTR [ASCIZ/.SYML of CHKEND failed./]
EXIT
SETLUZ: OUTSTR [ASCIZ/SETPR2 failed./]
EXIT
NOLOOK: OUTSTR [ASCIZ/
LOOKUP failed -- /]
HRRZ X,X ;GET ERROR CODE
CAILE X,MAXERR
MOVEI X,MAXERR
OUTSTR @FERROR(X)
OUTSTR [ASCIZ/.
/]
JRST 4,SYSFIX
FERROR: [ASCIZ/No such file/]
[ASCIZ/No such PPN/]
[ASCIZ/Protection violation/]
[ASCIZ/File busy/]
MAXERR←←.-FERROR
[ASCIZ/Bad retrieval or other horrible error/]
;Routine to scan filename (or parts thereof) from command line, storing in
;DMPFIL. It is intentionally left unchanged by initialization, so that you
;can RUN SYSFIX;filename and then REENTER without retyping the name.
;(This code adapted from PPSAV.FAI[CSP,SYS] -- JJW 12/83)
FSCAN: RESCAN ;Rescan to look for a file name
FSCAN1: INCHWL A ;Flush to the semicolon
CAIN A,12 ;Or to LF
POPJ P, ;Use default name - no semi seen
CAIE A,";" ;Semicolon yet?
JRST FSCAN1 ;No, continue scanning
FILNAM: MOVE A,[DMPFIL,,FILE] ;Start with default filename
BLT A,FILE+3
PUSHJ P,GETSIX ;Get file name
JUMPE B,.+2 ;Use default if no filename
MOVEM B,FILE
CAIE A,"." ;Extension given?
JRST FSCAN2 ;No
PUSHJ P,GETSIX ;Get extension
HLLZM B,FILE+1 ;Store extension
FSCAN2: CAIE A,"[" ;PPN?
JRST FSCAN3 ;No
PUSHJ P,GETSIX ;Get PRJ
PUSHJ P,RADJ ;Right-adjust
HLLM B,FILE+3
CAIN A,12 ;OK to end after PRJ
JRST FCOPY
CAIE A,"," ;Else comma necessary
JRST FERR
PUSHJ P,GETSIX
PUSHJ P,RADJ
HLRM B,FILE+3
MOVEI B,0
CAIN A,"]"
PUSHJ P,GETSIX
JUMPN B,FERR
FSCAN3: CAIE A,12
JRST FERR
;After scanning filename without errors, copy into DMPFIL.
FCOPY: MOVE A,[FILE,,DMPFIL]
BLT A,DMPFIL+3
POPJ P,
GETSIX: SETZB B,QUOTF# ;Not yet quoting filename
MOVE C,[POINT 6,B]
GETSX1: INCHWL A
CAIL A,"A"+40
CAILE A,"Z"+40
JRST .+2
JRST GETSX3
CAIL A,"A"
CAILE A,"Z"
JRST .+2
JRST GETSX2
CAIN A,"↓"
JRST [ SETCMM QUOTF ;Complement quote flag
JRST GETSX1 ] ;Get next char
CAIE A,175 ;Altmode?
CAIGE A,40
JRST NOQUOT ;Can't quote impossible sixbit char (like CR,LF)
SKIPE QUOTF
JRST GETSX2 ;In quote mode, most any char is ok
NOQUOT: CAIE A,40
CAIN A,15
JRST GETSX1
CAIL A,"0"
CAILE A,"9"
POPJ P, ;Delimiter is any letter/digit
GETSX2: SUBI A," " ;Make sixbit
GETSX3: TLNE C,770000
IDPB A,C
JRST GETSX1
RADJ: JUMPE B,FERR1
TRNE B,-1
JRST FERR1
TLNE B,77
POPJ P,
LSH B,-6
JRST .-3
FERR1: POP P,(P)
FERR: CLRBFI
OUTSTR [ASCIZ/
Illegal file name. Try again: /]
JRST FILNAM
;Type filename stored in DMPFIL
TYPFIL: MOVE B,DMPFIL
PUSHJ P,TYPSIX
OUTCHR ["."]
HLLZ B,DMPFIL+1
PUSHJ P,TYPSIX
OUTCHR ["["]
HLLZ B,DMPFIL+3
PUSHJ P,TYPSIX
OUTCHR [","]
HRLZ B,DMPFIL+3
PUSHJ P,TYPSIX
OUTCHR ["]"]
POPJ P,
TYPSIX: MOVEI C,6
TYPSI1: LSHC A,6
ANDI A,77
JUMPE A,TYPSI2
ADDI A," "
OUTCHR A
TYPSI2: SOJG C,TYPSI1
POPJ P,
END SYSFIX